///import core
///commands 为非ie浏览器自动添加a标签
///commandsName  AutoLink
///commandsTitle  自动增加链接
/**
 * @description 为非ie浏览器自动添加a标签
 * @author zhanyi
 */

UE.plugin.register(
    "autolink",
    function () {
        var cont = 0;

        return !browser.ie
            ? {
                bindEvents: {
                    reset: function () {
                        cont = 0;
                    },
                    keydown: function (type, evt) {
                        var me = this;
                        var keyCode = evt.keyCode || evt.which;

                        if (keyCode == 32 || keyCode == 13) {
                            var sel = me.selection.getNative(),
                                range = sel.getRangeAt(0).cloneRange(),
                                offset,
                                charCode;

                            var start = range.startContainer;
                            while (start.nodeType == 1 && range.startOffset > 0) {
                                start =
                                    range.startContainer.childNodes[range.startOffset - 1];
                                if (!start) {
                                    break;
                                }
                                range.setStart(
                                    start,
                                    start.nodeType == 1
                                        ? start.childNodes.length
                                        : start.nodeValue.length
                                );
                                range.collapse(true);
                                start = range.startContainer;
                            }

                            do {
                                if (range.startOffset == 0) {
                                    start = range.startContainer.previousSibling;

                                    while (start && start.nodeType == 1) {
                                        start = start.lastChild;
                                    }
                                    if (!start || domUtils.isFillChar(start)) {
                                        break;
                                    }
                                    offset = start.nodeValue.length;
                                } else {
                                    start = range.startContainer;
                                    offset = range.startOffset;
                                }
                                range.setStart(start, offset - 1);
                                charCode = range.toString().charCodeAt(0);
                            } while (charCode != 160 && charCode != 32);

                            if (
                                range
                                    .toString()
                                    .replace(new RegExp(domUtils.fillChar, "g"), "")
                                    .match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)
                            ) {
                                while (range.toString().length) {
                                    if (
                                        /^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(
                                            range.toString()
                                        )
                                    ) {
                                        break;
                                    }
                                    try {
                                        range.setStart(
                                            range.startContainer,
                                            range.startOffset + 1
                                        );
                                    } catch (e) {
                                        //trace:2121
                                        var start = range.startContainer;
                                        while (!(next = start.nextSibling)) {
                                            if (domUtils.isBody(start)) {
                                                return;
                                            }
                                            start = start.parentNode;
                                        }
                                        range.setStart(next, 0);
                                    }
                                }
                                //range的开始边界已经在a标签里的不再处理
                                if (
                                    domUtils.findParentByTagName(
                                        range.startContainer,
                                        "a",
                                        true
                                    )
                                ) {
                                    return;
                                }
                                var a = me.document.createElement("a"),
                                    text = me.document.createTextNode(" "),
                                    href;

                                me.undoManger && me.undoManger.save();
                                a.appendChild(range.extractContents());
                                a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, "");
                                href = a
                                    .getAttribute("href")
                                    .replace(new RegExp(domUtils.fillChar, "g"), "");
                                href = /^(?:https?:\/\/)/gi.test(href)
                                    ? href
                                    : "http://" + href;
                                a.setAttribute("_src", utils.html(href));
                                a.href = utils.html(href);

                                range.insertNode(a);
                                a.parentNode.insertBefore(text, a.nextSibling);
                                range.setStart(text, 0);
                                range.collapse(true);
                                sel.removeAllRanges();
                                sel.addRange(range);
                                me.undoManger && me.undoManger.save();
                            }
                        }
                    }
                }
            }
            : {};
    },
    function () {
        var keyCodes = {
            37: 1,
            38: 1,
            39: 1,
            40: 1,
            13: 1,
            32: 1
        };

        function checkIsCludeLink(node) {
            if (node.nodeType == 3) {
                return null;
            }
            if (node.nodeName == "A") {
                return node;
            }
            var lastChild = node.lastChild;

            while (lastChild) {
                if (lastChild.nodeName == "A") {
                    return lastChild;
                }
                if (lastChild.nodeType == 3) {
                    if (domUtils.isWhitespace(lastChild)) {
                        lastChild = lastChild.previousSibling;
                        continue;
                    }
                    return null;
                }
                lastChild = lastChild.lastChild;
            }
        }

        browser.ie &&
        this.addListener("keyup", function (cmd, evt) {
            var me = this,
                keyCode = evt.keyCode;
            if (keyCodes[keyCode]) {
                var rng = me.selection.getRange();
                var start = rng.startContainer;

                if (keyCode == 13) {
                    while (
                        start &&
                        !domUtils.isBody(start) &&
                        !domUtils.isBlockElm(start)
                        ) {
                        start = start.parentNode;
                    }
                    if (start && !domUtils.isBody(start) && start.nodeName == "P") {
                        var pre = start.previousSibling;
                        if (pre && pre.nodeType == 1) {
                            var pre = checkIsCludeLink(pre);
                            if (pre && !pre.getAttribute("_href")) {
                                domUtils.remove(pre, true);
                            }
                        }
                    }
                } else if (keyCode == 32) {
                    if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) {
                        start = start.previousSibling;
                        if (
                            start &&
                            start.nodeName == "A" &&
                            !start.getAttribute("_href")
                        ) {
                            domUtils.remove(start, true);
                        }
                    }
                } else {
                    start = domUtils.findParentByTagName(start, "a", true);
                    if (start && !start.getAttribute("_href")) {
                        var bk = rng.createBookmark();

                        domUtils.remove(start, true);
                        rng.moveToBookmark(bk).select(true);
                    }
                }
            }
        });
    }
);
